﻿//using System;
//using System.ComponentModel;
//using System.Linq;
//using System.Windows.Forms;
//using System.Drawing.Design;
//using System.Windows.Forms.Design;


//namespace UtfprLibrary.Windows.Forms.ComponentModel {
//    internal class UBNInitialValuedControlCollectionEditor : UITypeEditor {
//        /// <summary>
//        /// TODO
//        /// </summary>
//        public UBNInitialValuedControlCollectionEditor() { }

//        /// <summary>
//        /// TODO
//        /// </summary>
//        /// <param name="context"></param>
//        /// <returns></returns>
//        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) {
//            return UITypeEditorEditStyle.Modal;
//        }

//        /// <summary>
//        /// TODO
//        /// </summary>
//        /// <param name="context"></param>
//        /// <param name="provider"></param>
//        /// <param name="value"></param>
//        /// <returns></returns>
//        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
//            //coleção de valores retornados baseando-se nos valores serializados pelo Designer
//            var componentValue = value as UBNInitialValuedControlCollection;
//            //serviço que irá apresentar um formulário modal
//            IWindowsFormsEditorService editorService = null;

//            if (provider != null) {
//                editorService = provider.GetService(
//                    typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService;
//            }

//            if (editorService != null) {
//                //formulário que é exibido para a edição da coleção
//                var dialog = new UtfprFormInitialValuedControlCollectionEditor();

//                //coleção que armazenará a coleção de controles do formulário que está associado ao componente
//                var containerValue = new UBNInitialValuedControlCollection();

//                var validator = (UBNInitialValueProviderBase)context.Instance;

//                if (validator.UtfprBindingNavigator != null) {
//                    //carrega a coleção de controles do formulário que está associado ao componente
//                    foreach (Control c in context.Container.Components.OfType<Control>()) {
//                        if (c.GetType() == typeof(TextBox)) {
//                            try {
//////////////////////////////////if (c.DataBindings["Text"].DataSource == validator.UtfprBindingNavigator.BindingSource) {
//                                if (c.DataBindings["Text"].DataSource == validator.UtfprBindingNavigator.DataSource) {
//                                    containerValue.Add(new UtfprInitialValuedControl(c, null));
//                                }
//                            } catch { }
//                        }
//                    }
//                }

//                //se não existir nenhum controle associado
//                if (componentValue.Count == 0) {
//                    //carregue todos os controles do container na
//                    //coleção do formulário de edição
//                    dialog.SourceCollection = containerValue;
//                } else {
//                    foreach (UtfprInitialValuedControl c in containerValue) {
//                        //verifique se o componente possui o controle
//                        if (componentValue.ContainsControl(c.Control)) {
//                            //insira o controle na coleção de controles
//                            //marcados para validação
//                            int index = componentValue.GetItemIndex(c.Control);
//                            dialog.ValidatableCollection.Add(componentValue[index]);
//                        } else {
//                            //insira o controle na coleção de controles que ainda
//                            //não foram marcados para validação
//                            dialog.SourceCollection.Add(c);
//                        }
//                    }
//                }

//                //guarda as referências do formulário de diálogo, pois elas
//                //são destruidas assim que o formulário é fechado
//                var _sourceCollection = dialog.SourceCollection;
//                var _validatableCollection = dialog.ValidatableCollection;

//                if (editorService.ShowDialog(dialog) == DialogResult.OK) {
//                    //marca o componente para mudança
//                    context.OnComponentChanging();
                    
//                    //componentValue.Clear();

//                    //remove todos os componentes que foram desmarcados para validação
//                    foreach (UtfprInitialValuedControl c in _sourceCollection) {
//                        if (componentValue.GetItemIndex(c.Control) != -1) {
//                            int index = componentValue.GetItemIndex(c.Control);
//                            componentValue.RemoveAt(index);
//                        }
//                    }

//                    //adiciona todos os componentes que foram marcados para validação
//                    foreach (UtfprInitialValuedControl c in _validatableCollection) {
//                        if (!componentValue.ContainsControl(c.Control)) {
//                            componentValue.Add(c);
//                        }
//                    }

//                    //comita as mudanças efetuadas
//                    context.OnComponentChanged();
//                }
//            }

//            return componentValue;
//        }
//    }
//}
